05. 从远程仓库拉取修改
从远程仓库拉取修改
假如说我们处于这样一种情况: 远程 仓库上存在一些 commit ,但我们的 本地 仓库上没有这些 commit 。这种情况的原因有多个:你参与了团队协作,有一名同事将新更改推送到了远程仓库。或者,你在不同的电脑上开展同一个项目 -- 例如,你有一个办公电脑和一个私人电脑,你在两个电脑上都向仓库做了贡献。如果你从办公电脑上向远程仓库推送更改,则个人电脑上的本地仓库就不会反映这些更改。我们如何将远程仓库上的更改同步到本地仓库呢?这正是我们接下来要看的。我们先来看看拉取远程仓库修改的方式,然后我们将实际操作!
L1 - Git 拉取理论
虽然我已经说过了,但我要再强调一次。
本地
仓库中出现的分支实际上在跟踪
远程
仓库中的一个分支(例如,本地仓库中的
origin/master
称为
跟踪分支
,因为它在跟踪远程仓库上简写名为 "origin" 的
master
分支)。
添加远程更改
由于我们的远程仓库中没有任何 commit ,且我们未与任何人协作,我们模拟协作环境。并通过 GitHub 的 Web 界面手动添加一些 commit 。
下面是一个演练视频。使用下面的代码片段跟着视频一起操作。
新的 CSS 内容
添加以下新规则集:
.destination:hover h2 {
transform: rotate(0deg);
}
将
transition: transform 0.5s;
添加到
h2
规则集,现在它应该是:
h2 {
margin: 0;
transform: rotate(-45deg);
transition: transform 0.5s;
text-shadow: 0 0 5px #01579b;
}
L1 - 在 GitHub 上添加 commit
⚠️ 首选在本地工作 ⚠️
由于 GitHub 有一个 Web 界面,它允许你通过其界面手动添加 commit 。虽然你 可以 这么做,并不代表你 应该 这么做。我演示了用这种方式进行更改,是为了模拟远程仓库上的 commit ,而不是本地仓库上的 commit 。但是我建议你应该始终在本地开展项目工作,然后将更改推送到远程仓库。
取回远程 commit
现在我们比较本地仓库与远程仓库。我们的本地仓库中只有 三个 commit :
我们的本地仓库中只有三个 commit。
但远程仓库中实际有 四个 commit:
GitHub 上的远程仓库中有四个 commit 。其中三个来自我们的本地仓库,一个是我们在 GitHub 上手动添加的。
使用
git pull
拉取更改
本地 commit 在
5a010d1
处结束,而远程仓库有额外两个 commit - commit
4b81b2a
和
b847434
。
另外,注意在我们的
本地
仓库中,当我们使用
git log
命令时,
origin/master
分支仍然指向 commit
5a010d1
。
记住,
origin/master
分支不实时映射远程仓库 master 分支所在的位置。如果远程仓库的
master
分支移动,本地
origin/master
分支仍会待在原地。要更新此分支,我们需要同步两个仓库。
git push
会同步
远程
仓库与
本地
仓库。要执行相反操作(将
本地仓库
与
远程仓库
同步),我们需要使用
git pull
。
git pull
的格式与
git push
的非常相似 - 提供远程仓库的简写名,以及你要拉取 commit 的分支名称。
$ git pull origin master
运行
git pull origin master
会检索
origin
远程仓库
master
分支中的 commit 。
运行此代码时需要注意几点:
-
格式与
git push非常相似 - 要对项目计数、压缩和打包 -
它有一个短语 "fast-forward",这意味着 Git 进行了快进合并(我们一会儿深入研究)
-
它显示类似于
git log --stat的信息,其中显示更改的文件以及添加或删除了多少行
-
它显示类似于
如果你不想自动将本地分支与跟踪分支合并,则不应使用
git pull
,而是使用另一个命令
git fetch
。当远程仓库包含你没有的 commit ,
但
本地仓库也包含远程仓库所没有的 commit 时,你可能想这么做。
我们来看看
git fetch
。
小结
如果你想在本地仓库中包含远程仓库中的更改,那么你要
拉取
这些更改。要使用 Git 这样做,你需要使用
git pull
命令。你告诉 Git 你想获取修改的远程仓库的简写名以及包含你需要的更改的分支:
$ git pull origin master
在运行
git pull
时,会发生以下活动:
- 远程分支上的 commit 会被复制到本地仓库
-
本地跟踪分支(
origin/master)移到指向最新的 commit -
本地跟踪分支(
origin/master)合并到本地分支(master)
另外,可以在 GitHub 上手动添加更改(但不建议这样做,所以别这样做)。